package com.tianji.promotion.service.impl;

import com.tianji.promotion.domain.po.UserCoupon;
import com.tianji.promotion.mapper.CouponMapper;
import com.tianji.promotion.mapper.UserCouponMapper;
import com.tianji.promotion.service.IUserCouponService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/**
 * <p>
 * 用户领取优惠券的记录，是真正使用的优惠券信息 服务实现类
 * </p>
 *
 * @author yangyu
 * @since 2023-08-03
 */
@Service
@RequiredArgsConstructor
@Slf4j
public class UserCouponServiceImpl extends ServiceImpl<UserCouponMapper, UserCoupon> implements IUserCouponService {

    //couponService注入了UserCouponService，
    //所以这边注入Mapper，防止循环依赖
    private final CouponMapper couponMapper;


    /**
     * 领取优惠券接口
     *
     * @param couponId 优惠券id
     */
    @Override
    public void receiveCoupon(Long couponId) {
        log.info("领取优惠券接口:{}",couponId);

        //1.查询优惠券

        //2.校验发放时间

        //3.校验库存

        //4.校验每个人限领取的数量
        //4.1.统计当前用户，对当前优惠券的已经领取数量

        //4.2.判断是否超过每人限领取数量

        //5.更新优惠券，已发放的数量+1

        //6.新增一个用户券
        //优惠券的拥有者
        //优惠券id
        //有效期开始时间，没有则固定天数，那么是当前时间
        //有效期结束时间
    }



    /**
     * 兑换码兑换优惠券接口
     *
     * @param code 兑换码
     */
    @Override
    public void exchangeCoupon(String code) {
        log.info("开始执行兑换码兑换优惠券:{}",code);
        //1.校验并解析兑换码
        //拿到兑换码的序列号，也就是兑换码的id

        //2.去Redis的BitMap中校验是否已经兑换过，SetBit  Key  4  1
        //GetBit和SetBit分开使用则会出现线程安全问题。
        //所以这里直接执行setbit，通过返回值来判断是否兑换过 1：true     0：false

        //3.去mysql中，查询兑换码对应的优惠券id
        //直接根据兑换码去兑换码表，查询兑换码目标id

        //4.判断兑换码是否过期

        //5.校验并生成用户券
        //5.1.查询优惠券
        //5.2.查询用户
        //5.3.校验并生成用户券，更新兑换码的状态


        //6.更新mysql中兑换码的状态

        //出现异常，重置兑换的标记 0
        //走到这里，以前的状态一定是false 未兑换

    }
}
